home *** CD-ROM | disk | FTP | other *** search
- // GenericSerial.c
- // Used on Mac & Palm platforms, for both the server/client apps
-
- #include <Types.h>
-
-
- #include "GenericSerial.h"
-
- #ifndef NULL
- #define NULL (0L)
- #endif
-
- static MyPacket gInPacket;
-
- static char gInBuf[kMaxExtraDataSize];
- static char gOutBuf[sizeof(MyPacket) + kMaxExtraDataSize];
-
-
- static void Reply(long p1, long p2, long p3, long p4, short dataSize, short result);
-
- static void Send(short op, long p1, long p2, long p3, long p4, short dataSize, char* bufP);
- static void Receive(long *p1, long *p2, long *p3, long *p4, short *resultP, char *bufP);
-
-
- // called repeatedly by main event loop of server application
- void ServeSomething(void)
- {
- short err;
- long filep = 0;
- long numBytes, size, iterator, attr;
- // request a message:
- err = SerialRead(sizeof(MyPacket), (char*)&gInPacket);
-
- if(err != 0) return; // (0 = noErr = errNone :-)
-
- // check the cookie so we know we're interpreting the data correctly
- if(gInPacket.cookie != kCookieValue) return;
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- if(gInPacket.dataSize > 0)
- {
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- err = SerialRead(gInPacket.dataSize, gInBuf);
- if(err != 0) return; // (0 = noErr = errNone :-)
- }
-
-
- switch(gInPacket.op)
- {
- case kDirEnumerate:
- // param1 - dirp
- // param2 - iterator
-
- //Debugger();
- iterator = gInPacket.param2;
- err = LocalDirIterate(gInPacket.param1, (unsigned long*)&iterator, gOutBuf, &size, &attr);
-
- // reply:
- // param1 - new iterator
- // param2 - attributes
- // result - result code
- // extra data - file name, etc...
- if(err)
- {
- Reply(iterator, 0, 0, 0, 0, err);
- }
- else
- {
- Reply(iterator, attr, 0, 0, size+1, err);
- }
-
- break;
-
- case kFileCreate:
- // extra data - pathname
-
- //Debugger();
-
- // make sure we have a path:
- if(gInPacket.dataSize == 0) Reply(0,0,0,0,0,-1);
- err = LocalFileCreate(gInBuf);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
-
- break;
-
- case kDirCreate:
- // extra data - pathname
-
- //Debugger();
-
- // make sure we have a path:
- if(gInPacket.dataSize == 0) Reply(0,0,0,0,0,-1);
- err = LocalDirCreate(gInBuf);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
-
- break;
-
-
- case kFileOpen:
- // param1 - permissions
- // extra data - pathname
-
- //Debugger();
-
- // make sure we have a path:
- filep = 0;
- if(gInPacket.dataSize == 0) Reply(0,0,0,0,0,-1);
- err = LocalFileOpen(gInBuf, gInPacket.param1, &filep);
-
- // reply:
- // param1 - file ptr
- // result - result code
- Reply(filep, 0, 0, 0, 0, err);
-
- //Debugger();
-
- break;
-
- case kFileClose:
- // param1 - filep
-
- //Debugger();
- err = LocalFileClose(gInPacket.param1);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- case kFileRead:
- // param1 - filep
- // param2 - numBytes
-
- numBytes = gInPacket.param2;
- //Debugger();
-
- if(numBytes > kMaxExtraDataSize) Reply(0,0,0,0,0,-1);
-
- // read the data...
- err = LocalFileRead(gInPacket.param1, numBytes, &numBytes, gOutBuf);
-
- // send the data back...
- // reply:
- // param1 - number of bytes read (in this message)
- // result - possibly error code
- Reply(numBytes, 0, 0, 0, numBytes, err);
-
- break;
-
- case kFileWrite:
- // param1 - filep
- // param2 - numBytes
- // extra data - data to write
-
- numBytes = gInPacket.param2;
-
- //Debugger();
-
- // sanity check:
- if(numBytes != gInPacket.dataSize) Reply(0,0,0,0,0,-1);
-
- // write the data...
- err = LocalFileWrite(gInPacket.param1, numBytes, &numBytes, gInBuf);
-
- // send the reply back...
- // reply:
- // param1 - number of bytes read (in this message)
- // result - possibly error code
- Reply(numBytes, 0, 0, 0, 0, err);
-
- break;
-
- case kFileSeek:
- // param1 - filep
- // param2 - origin
- // param3 - offset
-
- //Debugger();
- err = LocalFileSeek(gInPacket.param1, gInPacket.param2, gInPacket.param3);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- case kFileSize:
- // param1 - filep
-
- //Debugger();
- err = LocalFileSize(gInPacket.param1, &size);
-
- // reply:
- // p1 - size of file
- // result - result code
- Reply(size, 0, 0, 0, 0, err);
-
- break;
-
- case kFileResize:
- // param1 - filep
- // param2 - new size
-
- //Debugger();
- err = LocalFileResize(gInPacket.param1, gInPacket.param2);
-
- // reply:
- // p1 - size of file
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- case kFileRename:
- // unimplemented
- DebugStr("\prename unimplemented");
- break;
-
- case kFileDelete:
- // extra data - path
- err = LocalFileDelete(gInBuf);
-
- // Reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- default:
- DebugStr("\pUnrecognized command");
- }
-
-
- return;
- }
-
- // send a reply to client:
- void Reply(long p1, long p2, long p3, long p4, short dataSize, short result)
- {
- MyPacket outPacket;
- short err;
-
- // initialize outPacket:
- outPacket.cookie = kCookieValue;
- outPacket.op = gInPacket.op;//kFileOpResult;
- outPacket.dataSize = dataSize;
- outPacket.result = result;
- outPacket.reserved = 0;
- outPacket.param1 = p1;
- outPacket.param2 = p2;
- outPacket.param3 = p3;
- outPacket.param4 = p4;
-
- err = SerialWrite(sizeof(MyPacket), (char*)&outPacket);
-
- if(err == 0 && dataSize > 0)
- {
- // send extra data, if any:
- err = SerialWrite(dataSize, gOutBuf);
- }
-
- return;
- }
-